package com.itxh.mybatis.model;

import com.itxh.mybatis.utils.GenericTokenParser;
import com.itxh.mybatis.utils.OgnlUtils;
import com.itxh.mybatis.utils.TokenHandler;

/**
 * 该SqlNode保存的sql文本中包含${}
 */
public class TextSqlNode implements SqlNode{
    private String sqlText;

    public TextSqlNode(String sqlText) {
        this.sqlText = sqlText;
    }

    @Override
    public void apply(DynamicContext context) {

        // 再单独解析#{}
        BindingsTokenHandler tokenHandler = new BindingsTokenHandler(context);
        GenericTokenParser tokenParser = new GenericTokenParser("${","}",tokenHandler);
        String sql = tokenParser.parse(sqlText);

        context.append(sql);
    }

    class BindingsTokenHandler implements TokenHandler{
        private DynamicContext context;

        public BindingsTokenHandler(DynamicContext context) {
            this.context = context;
        }

        @Override
        public String handleToken(String content) {
            // 获取入参对象
            Object parameter = context.getBindings().get("_parameter");
            // 根据content(入参对象中的属性名称,可能是user.username)去入参对象中获取对应的值
            if(isSimpleType(parameter)){
                return parameter.toString();
            }
            Object value = OgnlUtils.getValue(content, parameter);

            return value.toString();
        }

        private boolean isSimpleType(Object param) {

            return param instanceof Integer || param instanceof String ;
        }

    }
}
